#define _CRT_SECURE_NO_WARNINGS

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_SIZE 10

typedef struct Table {
    int* data; //数据
    int length; //长度
    int size; //容量
} table;

table InitTable(int size);
void DisplayTable(table t);
table InsertTable(table t, int data, int index);
table DeleteTable(table t, int index);

void Menu(void)
{
    printf("\n");
    printf("1.初始化表\n");
    printf("2.显示表\n");
    printf("3.插入数据\n");
    printf("4.删除数据\n");
    printf("5.退出\n");
    printf("请输入您的选择：\n");
}

int main()
{
    table t = InitTable(MAX_SIZE); //初始化一个长度为10的表
    while (true) {
        Menu();
        int choice, index;
        scanf("%d", &choice);
        switch (choice) {
        case 1:
            t = InitTable(MAX_SIZE);
            break;
        case 2:
            DisplayTable(t);
            break;
        case 3:
            printf("请输入要插入的数据：\n");
            int data;
            scanf("%d", &data);
            printf("请输入要插入的位置：\n");
            scanf("%d", &index);
            t = InsertTable(t, data, index - 1);
            break;
        case 4:
            printf("请输入要删除的位置：\n");
            scanf("%d", &index);
            t = DeleteTable(t, index - 1);
            break;
        case 5:
            exit(0);
        default:
            printf("输入错误，请重新输入！\n");
            break;
        }
    }

    return 0;
}

// 创建空白顺序表
table InitTable(int size)
{
    table t;
    // t.data = NULL;
    t.data = (int*)malloc(sizeof(int) * size);
    //检查初始化是否失败
    if (t.data == NULL) {
        printf("初始化失败");
        exit(1);
    }

    // 洗干净内存
    memset(t.data, 0, sizeof(int) * size);

    // 插入5个示例数据
    t.data[0] = 1;
    t.data[1] = 2;
    t.data[2] = 3;
    t.data[3] = 4;
    t.data[4] = 5;

    t.length = 5;
    t.size = size;
    return t;
}

// 显示顺序表
void DisplayTable(table t)
{
    printf("\n存储的数据为:\n");
    int i;
    for (i = 0; i < t.length; i++) {
        printf("%d ", t.data[i]);
    }
    printf("\n");
}

// 插入数据，数据是data，插入到index位置
table InsertTable(table t, int data, int index)
{
    // 检查是否越界
    if (index < 0 || index > t.length) {
        printf("插入位置越界");
        exit(1);
    }

    // 检查是否满了
    if (t.length == t.size) {
        printf("表已满");
        exit(1);
    }

    // 插入数据
    int i;
    for (i = t.length; i > index; i--) {
        t.data[i] = t.data[i - 1]; //后移
    }
    // 插入数据
    t.data[index] = data;
    t.length++;
    return t;
}

// 删除数据，删除index位置的数据
table DeleteTable(table t, int index)
{
    // 检查是否越界
    if (index < 0 || index > t.length) {
        printf("删除位置越界");
        exit(1);
    }

    // 删除数据
    int i;
    for (i = index; i < t.length - 1; i++) {
        t.data[i] = t.data[i + 1]; //前移
    }
    t.length--;
    return t;
}
